#ifndef ERRORHANDLER_H
#define ERRORHANDLER_H

#include <QString>
#include <QDateTime>
#include <QMessageBox>
#include <QTextStream>
#include <QFile>
#include <QMutex>
#include <QDebug>

/**
 * @brief 餐厅点餐系统错误处理工具类
 * 
 * 提供统一的错误处理、日志记录和用户消息显示功能
 */

namespace RestaurantSystem {

/**
 * @brief 错误级别枚举
 */
enum class ErrorLevel {
    INFO = 0,       // 信息
    WARNING = 1,    // 警告
    ERROR = 2,      // 错误
    CRITICAL = 3    // 严重错误
};

/**
 * @brief 错误处理器类
 */
class ErrorHandler {
public:
    /**
     * @brief 获取单例实例
     */
    static ErrorHandler& instance();
    
    /**
     * @brief 处理错误
     * @param level 错误级别
     * @param message 错误消息
     * @param context 错误上下文(可选)
     * @param showToUser 是否显示给用户
     */
    void handleError(ErrorLevel level, const QString& message, 
                    const QString& context = "", bool showToUser = true);
    
    /**
     * @brief 记录日志
     * @param level 日志级别
     * @param message 日志消息
     * @param context 上下文信息
     */
    void logMessage(ErrorLevel level, const QString& message, const QString& context = "");
    
    /**
     * @brief 显示用户消息
     * @param message 消息内容
     * @param icon 消息图标类型
     * @param title 消息标题
     */
    void showUserMessage(const QString& message, 
                        QMessageBox::Icon icon = QMessageBox::Information,
                        const QString& title = "");
    
    /**
     * @brief 显示确认对话框
     * @param message 确认消息
     * @param title 对话框标题
     * @return 用户是否确认
     */
    bool showConfirmDialog(const QString& message, const QString& title = "确认");
    
    /**
     * @brief 启用/禁用日志记录
     * @param enabled 是否启用
     */
    void setLoggingEnabled(bool enabled) { m_loggingEnabled = enabled; }
    
    /**
     * @brief 设置日志文件路径
     * @param filePath 日志文件路径
     */
    void setLogFilePath(const QString& filePath) { m_logFilePath = filePath; }
    
    /**
     * @brief 设置最大日志文件大小
     * @param maxSize 最大大小(字节)
     */
    void setMaxLogFileSize(qint64 maxSize) { m_maxLogFileSize = maxSize; }
    
    /**
     * @brief 清理旧日志文件
     */
    void cleanupLogFiles();
    
    /**
     * @brief 获取错误级别字符串
     * @param level 错误级别
     * @return 级别字符串
     */
    static QString errorLevelToString(ErrorLevel level);
    
    /**
     * @brief 格式化错误消息
     * @param level 错误级别
     * @param message 消息内容
     * @param context 上下文
     * @return 格式化后的消息
     */
    static QString formatErrorMessage(ErrorLevel level, const QString& message, 
                                    const QString& context);

private:
    ErrorHandler() = default;
    ~ErrorHandler() = default;
    ErrorHandler(const ErrorHandler&) = delete;
    ErrorHandler& operator=(const ErrorHandler&) = delete;
    
    /**
     * @brief 写入日志文件
     * @param message 日志消息
     */
    void writeToLogFile(const QString& message);
    
    /**
     * @brief 检查日志文件大小并轮转
     */
    void rotateLogFileIfNeeded();
    
    /**
     * @brief 获取消息框图标
     * @param level 错误级别
     * @return 对应的图标
     */
    QMessageBox::Icon getMessageBoxIcon(ErrorLevel level);

private:
    bool m_loggingEnabled = true;
    QString m_logFilePath = "restaurant_system.log";
    qint64 m_maxLogFileSize = 10 * 1024 * 1024; // 10MB
    QMutex m_logMutex;
};

/**
 * @brief 便捷的错误处理宏定义
 */
#define LOG_INFO(message, context) \
    ErrorHandler::instance().logMessage(ErrorLevel::INFO, message, context)

#define LOG_WARNING(message, context) \
    ErrorHandler::instance().logMessage(ErrorLevel::WARNING, message, context)

#define LOG_ERROR(message, context) \
    ErrorHandler::instance().logMessage(ErrorLevel::ERROR, message, context)

#define LOG_CRITICAL(message, context) \
    ErrorHandler::instance().logMessage(ErrorLevel::CRITICAL, message, context)

#define HANDLE_ERROR(level, message, context, showToUser) \
    ErrorHandler::instance().handleError(level, message, context, showToUser)

#define SHOW_INFO(message) \
    ErrorHandler::instance().showUserMessage(message, QMessageBox::Information)

#define SHOW_WARNING(message) \
    ErrorHandler::instance().showUserMessage(message, QMessageBox::Warning)

#define SHOW_ERROR(message) \
    ErrorHandler::instance().showUserMessage(message, QMessageBox::Critical)

#define CONFIRM_ACTION(message) \
    ErrorHandler::instance().showConfirmDialog(message)

/**
 * @brief 异常安全的操作执行器
 */
template<typename Func>
bool safeExecute(Func&& func, const QString& context = "", bool showErrorToUser = true) {
    try {
        func();
        return true;
    } catch (const std::exception& e) {
        QString errorMsg = QString("标准异常: %1").arg(e.what());
        ErrorHandler::instance().handleError(ErrorLevel::ERROR, errorMsg, context, showErrorToUser);
        return false;
    } catch (...) {
        QString errorMsg = "未知异常";
        ErrorHandler::instance().handleError(ErrorLevel::CRITICAL, errorMsg, context, showErrorToUser);
        return false;
    }
}

/**
 * @brief 文件操作结果枚举
 */
enum class FileOperationResult {
    SUCCESS = 0,
    FILE_NOT_FOUND,
    PERMISSION_DENIED,
    DISK_FULL,
    CORRUPTED_DATA,
    UNKNOWN_ERROR
};

/**
 * @brief 将文件操作结果转换为错误消息
 * @param result 操作结果
 * @return 错误消息
 */
QString fileOperationResultToString(FileOperationResult result);

/**
 * @brief 数据验证结果结构
 */
struct ValidationResult {
    bool isValid = false;
    QString errorMessage;
    
    ValidationResult() = default;
    ValidationResult(bool valid, const QString& message = "") 
        : isValid(valid), errorMessage(message) {}
    
    operator bool() const { return isValid; }
};

} // namespace RestaurantSystem

#endif // ERRORHANDLER_H
